<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="utf-8" />
        <title>Part.2.C.why-start-from-writing-functions</title>
        <link rel="stylesheet" href="/theme/css/main.css" />

        <!--[if IE]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
</head>

<body id="index" class="home">
        <header id="banner" class="body">
                <h1><a href="/">PythonTutorials </a></h1>
                <nav><ul>
                    <li><a href="/category/cpp.html">cpp</a></li>
                    <li class="active"><a href="/category/python.html">python</a></li>
                </ul>
                </nav>
        </header><!-- /#banner -->
<section id="content" class="body">
  <article>
    <header>
      <h1 class="entry-title">
        <a href="/Part.2.C.why-start-from-writing-functions.html" rel="bookmark"
           title="Permalink to Part.2.C.why-start-from-writing-functions">Part.2.C.why-start-from-writing-functions</a></h1>
    </header>

    <div class="entry-content">
<footer class="post-info">
        <span>Mon 06 April 2020</span>
<span>| tags: <a href="/tag/python.html">python</a><a href="/tag/progarmming.html">progarmming</a><a href="/tag/excel.html">Excel</a></span>
</footer><!-- /.post-info -->      <h1>为什么从函数开始？</h1>
<p>读完第一部分之后，你多多少少已经 “写” 了一些程序，虽然我们总是说，“这就是让你脱盲”；也就是说，从此之后，你多多少少能够读懂程序，这就已经很好了。</p>
<p>可是你无论如何都避免不了已经写了一些，虽然，那所谓的 “写”，不过是 “改” 而已 —— 但毕竟也是一大步。</p>
<p>绝大多数编程书籍并不区分学习者的 “读” 与 “写” 这两个实际上应该分离的阶段 —— 虽然现实中这两个阶段总是多多少少重叠一部分。</p>
<p>在一个比较自然的过程中，我们总是先学会阅读，而后才开始练习写作；并且，最终，阅读的量一定远远大于写作的量 —— 即，输入远远大于输出。当然，貌似也有例外。据说，香港作家倪匡，他自己后来很少读书，每天咣当咣当地像是打扫陈年旧物倒垃圾一样写作 —— 他几乎是全球最具产量的畅销小说作家，貌似地球另外一端的史蒂芬・金都不如他多。又当然，他的主要输入来自于他早年丰富的人生经历，人家读书，他阅世，所以，实际上并不是输入很少，恰恰相反，是输入太多……</p>
<p>所以，正常情况下，输入多于输出，或者，输入远远多于输出，不仅是自然现象，也是无法改变的规则。</p>
<p>于是，我在安排内容的时候，也刻意如此安排。</p>
<p>第一部分，主要在于启动读者在编程领域中的 “阅读能力”，到第二部分，才开始逐步启动读者在编程领域中的 “写作能力”。</p>
<p>在第二部分启动之前，有时间有耐心的读者可以多做一件事情。</p>
<p>Python 的代码是开源的，它的代码仓库在 Github 上：</p>
<blockquote>
<p>https://github.com/python/</p>
</blockquote>
<p>在这个代码仓库中，有一个目录下，保存着若干 Python Demo 程序：</p>
<blockquote>
<p>https://github.com/python/cpython/tree/master/Tools/demo</p>
</blockquote>
<p>这个目录下的 README 中有说明：</p>
<blockquote>
<p>This directory contains a collection of demonstration scripts for
various aspects of Python programming.</p>
<ul>
<li><code>beer.py</code>        Well-known programming example: Bottles of beer.</li>
<li><code>eiffel.py</code>      Python advanced magic: A metaclass for Eiffel post/preconditions.</li>
<li><code>hanoi.py</code>       Well-known programming example: Towers of Hanoi.</li>
<li><code>life.py</code>        Curses programming: Simple game-of-life.</li>
<li><code>markov.py</code>      Algorithms: Markov chain simulation.</li>
<li><code>mcast.py</code>       Network programming: Send and receive UDP multicast packets.</li>
<li><code>queens.py</code>      Well-known programming example: N-Queens problem.</li>
<li><code>redemo.py</code>      Regular Expressions: GUI script to test regexes.</li>
<li><code>rpython.py</code>     Network programming: Small client for remote code execution.</li>
<li><code>rpythond.py</code>    Network programming: Small server for remote code execution.</li>
<li><code>sortvisu.py</code>    GUI programming: Visualization of different sort algorithms.</li>
<li><code>ss1.py</code>         GUI/Application programming: A simple spreadsheet application.</li>
<li><code>vector.py</code>      Python basics: A vector class with demonstrating special methods.</li>
</ul>
</blockquote>
<p>最起码把这其中的以下几个程序都精读一下，看看自己的理解能力：</p>
<blockquote>
<ul>
<li><a href="https://github.com/python/cpython/blob/master/Tools/demo/beer.py">beer.py</a>        Well-known programming example: Bottles of beer.</li>
<li><a href="https://github.com/python/cpython/blob/master/Tools/demo/eiffel.py">eiffel.py</a>      Python advanced magic: A metaclass for Eiffel post/preconditions.</li>
<li><a href="https://github.com/python/cpython/blob/master/Tools/demo/hanoi.py">hanoi.py</a>       Well-known programming example: Towers of Hanoi.</li>
<li><a href="https://github.com/python/cpython/blob/master/Tools/demo/life.py">life.py</a>        Curses programming: Simple game-of-life.</li>
<li><a href="https://github.com/python/cpython/blob/master/Tools/demo/markov.py">markov.py</a>      Algorithms: Markov chain simulation.</li>
<li><a href="https://github.com/python/cpython/blob/master/Tools/demo/queens.py">queens.py</a>      Well-known programming example: N-Queens problem.</li>
</ul>
</blockquote>
<p>就算读不懂也没关系，把读不懂的部分标记下来，接下来就可以 “带着问题学习”……</p>
<p>在未来的时间里，一个好的习惯就是，有空了去读读别人写的代码 —— 理解能力的提高，就靠这个了。你会发现这事跟其他领域的学习没什么区别。你学英语也一样，读多了，自然就读得快了，理解得快了，并且在那过程中自然而然地习得了很多 “句式”，甚至很多 “说理的方法”、“讲故事的策略”…… 然后就自然而然地会写了，从能写一点开始，慢慢到 “很能写”！</p>
<p>为了顺利启动第一部分的 “阅读”，特意找了个不一样的入口，“布尔运算”；第二部分，从 “阅读” 过渡到 “写作”，我也同样特意寻找了一个不一样的入口：<strong>从函数开始写起</strong>。</p>
<p>从小入手，从来都是自学的好方法。我们没有想着一上来就写程序，而是写 “子程序”、“小程序”、“短程序”。从结构化编程的角度来看，写函数的一个基本要求就是：</p>
<blockquote>
<ul>
<li>完成一个功能；</li>
<li>只完成一个功能；</li>
<li>没有任何错误地只完成一个功能……</li>
</ul>
</blockquote>
<p>然而，即便是从小入手，任务也没有变得过分简单。其中涉及的话题理解起来并不容易，尽管我们尽量用最简单的例子。涉及的话题有：</p>
<blockquote>
<ul>
<li>参数的传递</li>
<li>多参数的传递</li>
<li>匿名函数以及函数的别称</li>
<li>递归函数</li>
<li>函数文档</li>
<li>模块</li>
<li>测试驱动编程</li>
<li>可执行程序</li>
</ul>
</blockquote>
<p>这些都是你未来写自己的工程时所必须仰仗的基础，马虎不得，疏漏不得。</p>
<p>另外，这一部分与第一部分有一个刻意不同的编排，这一部分的每一章之后，<strong>没有写总结</strong> —— 那个总结需要读者自己动手完成。你需要做的不仅仅是每一个章节的总结，整个第二部分读完之后，还要做针对整个 “深入了解函数”（甚至应该包括第一部分已经读过的关于函数的内容）的总结…… 并且，关于函数，这一章并未完全讲完呢，第三部分还有生成器、迭代器、以及装饰器要补充 —— 因为它们多多少少都涉及到下一部分才能深入的内容，所以，在这一部分就暂时没有涉及。</p>
<p>你要习惯，归纳、总结、整理的工作，从来都不是一次就能完成的，都需要反复多次之后才能彻底完成。必须习惯这种流程 —— 而不是像那些从未自学过的人一样，对这种东西想当然地全不了解。</p>
<p>另外，从现代编程方法论来看，“写作” 部分一上来就从函数入手也的确是 “更正确” 的，因为结构化编程的核心就是拆分任务，把任务拆分到不能再拆分为止 —— 什么时候不能再拆分了呢？就是当一个函数只完成一个功能的时候……</p>
    </div><!-- /.entry-content -->

  </article>
</section>
        <section id="extras" class="body">
                <div class="blogroll">
                        <h2>blogroll</h2>
                        <ul>
                            <li><a href="http://getpelican.com/">Pelican</a></li>
                            <li><a href="http://python.org/">Python.org</a></li>
                            <li><a href="http://jinja.pocoo.org/">Jinja2</a></li>
                            <li><a href="#">You can modify those links in your config file</a></li>
                        </ul>
                </div><!-- /.blogroll -->
                <div class="social">
                        <h2>social</h2>
                        <ul>

                            <li><a href="#">You can add links in your config file</a></li>
                            <li><a href="#">Another social link</a></li>
                        </ul>
                </div><!-- /.social -->
        </section><!-- /#extras -->

        <footer id="contentinfo" class="body">
                <p>Powered by <a href="http://www.maxiaoan.com/">Maxiaoan</a></p>
        </footer><!-- /#contentinfo -->

</body>
</html>